package main

import "fmt"

// topic1：求n的阶乘
// 方法1、循环求n的阶乘
func factorial(n int) int {
	if n < 0 {
		panic("n cannot be negative")
	} else if n < 2 {
		return 1
	}
	var a = 1
	for i := 1; i <= n; i++ {
		a *= i
	}
	return a
}

// 方法2、递归求n的阶乘
func factorial1(n int) int {
	if n < 0 {
		panic("n cannot be negative")
	} else if n < 2 {
		return 1
	}
	return n * factorial1(n-1)
}

// topic2：编写一个函数，接受一个形参n，n为正整数，打印出上三角，数字必须对其
func triangle(n uint) {
	// 控制行数，从1到n
	for i := uint(1); i <= n; i++ {
		// 打印空格符来占位
		for k := uint(1); k <= n-i; k++ {
			fmt.Printf("   ")
		}
		// 从当前行数i到1，依次输出数字，并且给输出的每个数字给定占据的3个字符宽度，这样可以保证数字之间的间隔相等
		for j := i; j >= 1; j-- {
			fmt.Printf("%3d", j)
		}
		fmt.Println()
	}
}

func main() {
	// topic1中的循环求n的阶乘方法
	v := factorial(8)
	fmt.Println(v)

	// topic1中的递归求n的阶乘方法
	v1 := factorial1(8)
	fmt.Println(v1)

	// topic2的上三角
	triangle(12)
}

// 批改意见
// 输出倒三角时也需要考虑故意输入0或者小于0的数值特殊情况